package daos;

import hibernate.HibernateUtil;
import java.util.Calendar;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import negocio.Medico;
import negocio.Turno;

public class TurnoDAO {

	private static TurnoDAO instancia = null;
	private static SessionFactory sf = null;

	public static TurnoDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new TurnoDAO();
		} 
		return instancia;
	}
	
	public void guardarTurno(Turno t){
		Session session = sf.openSession();
		session.beginTransaction();
		session.save(t);
		session.flush();
		session.getTransaction().commit();
		session.close();
	}

	public void guardarTurnos(List<Turno> turnos){
		Session session = sf.openSession();
		session.beginTransaction();
		for(Turno t:turnos){
			session.save(t);
		}
		session.flush();
		session.getTransaction().commit();
		session.close();
	}
	
	public void actualizarTurnos(List<Turno> turnos){
		Session session = sf.openSession();
		session.beginTransaction();
		for(Turno t:turnos){
			session.update(t);
		}
		session.flush();
		session.getTransaction().commit();
		session.close();
	}

	public void actualizarTurno(Turno t){
		Session session = sf.openSession();
		session.beginTransaction();
		session.update(t);
		session.flush();
		session.getTransaction().commit();
		session.close();
	}

	@SuppressWarnings("unchecked")
	public List<Turno> obtenerTurnosEnFecha(Medico medico, Calendar fecha){
		Session session = sf.openSession();
		Query q = session.createQuery("select t from Turno t"
				+" where t.medico=:medico  " 
				+" and year(t.fechaYhora)=year(:fecha) and month(t.fechaYhora)=month(:fecha)" +
				" and day(t.fechaYhora)=day(:fecha)"
				).setParameter("medico", medico)
				.setDate("fecha", fecha.getTime());	
		List<Turno> turnos = (List<Turno>)q.list();
		session.close();
		return turnos;
	}
	
	public Turno obtenerTurnoEnFechaYhora(Medico m, Calendar fecha){
		Session session = sf.openSession();
		Query q = session.createQuery("select t from Turno t, Medico m, Paciente p"
				+" where m.idMedico=:id " 
				+" and year(t.fechaYhora)=year(:fecha) and month(t.fechaYhora)=month(:fecha)" +
				" and day(t.fechaYhora)=day(:fecha) " 
				+"and hour(t.fechaYhora)=hour(:tiempo) and minute(t.fechaYhora)=minute(:tiempo)")
				.setLong("id", m.getIdMedico())
				.setDate("fecha", fecha.getTime())
				.setTime("tiempo", fecha.getTime());
				
		Turno turno = (Turno)q.uniqueResult();
		session.close();	
		return turno;
	}

	@SuppressWarnings("unchecked")
	public List<Turno> obtenerTurnosActuales(Medico medico){
		Session session = sf.openSession();
		List<Turno> turnos = session.createQuery("from Turno t where t.esActual=1 and t.medico=:medico")
				.setParameter("medico", medico).list();
		session.close();
		return turnos;
	}
	
	public Calendar obtenerFechaMasLejanaDeTurnos(Medico medico){
		Session session = sf.openSession();
		Calendar fecha = (Calendar)session.
				createQuery("select max(t.fechaYhora) from Turno t where t.medico=:medico")
				.setParameter("medico", medico).uniqueResult();
		session.close();
		return fecha;
	}	

}
